
/*
 * Copyright 2002-2021 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 *版权所有2002-2021原作者。
 *
 *根据Apache许可证2.0版（“许可证”）许可；
 *除非符合许可证的规定，否则您不得使用此文件。
 *您可以在以下网址获取许可证副本
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 *除非适用法律要求或书面同意，否则软件
 *根据许可证分发是在“按原样”的基础上分发的，
 *无任何明示或暗示的保证或条件。
 *有关管理权限的特定语言，请参阅许可证
 *许可证下的限制。
 */

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Indicates whether a bean is to be lazily initialized.
 *
 * <p>May be used on any class directly or indirectly annotated with {@link
 * org.springframework.stereotype.Component @Component} or on methods annotated with
 * {@link Bean @Bean}.
 *
 * <p>If this annotation is not present on a {@code @Component} or {@code @Bean} definition,
 * eager initialization will occur. If present and set to {@code true}, the {@code @Bean} or
 * {@code @Component} will not be initialized until referenced by another bean or explicitly
 * retrieved from the enclosing {@link org.springframework.beans.factory.BeanFactory
 * BeanFactory}. If present and set to {@code false}, the bean will be instantiated on
 * startup by bean factories that perform eager initialization of singletons.
 *
 * <p>If Lazy is present on a {@link Configuration @Configuration} class, this
 * indicates that all {@code @Bean} methods within that {@code @Configuration}
 * should be lazily initialized. If {@code @Lazy} is present and false on a {@code @Bean}
 * method within a {@code @Lazy}-annotated {@code @Configuration} class, this indicates
 * overriding the 'default lazy' behavior and that the bean should be eagerly initialized.
 *
 * <p>In addition to its role for component initialization, this annotation may also be placed
 * on injection points marked with {@link org.springframework.beans.factory.annotation.Autowired}
 * or {@link jakarta.inject.Inject}: In that context, it leads to the creation of a
 * lazy-resolution proxy for all affected dependencies, as an alternative to using
 * {@link org.springframework.beans.factory.ObjectFactory} or {@link jakarta.inject.Provider}.
 * Please note that such a lazy-resolution proxy will always be injected; if the target
 * dependency does not exist, you will only be able to find out through an exception on
 * invocation. As a consequence, such an injection point results in unintuitive behavior
 * for optional dependencies. For a programmatic equivalent, allowing for lazy references
 * with more sophistication, consider {@link org.springframework.beans.factory.ObjectProvider}.
 *
 * @author Chris Beams
 * @author Juergen Hoeller
 * @since 3.0
 * @see Primary
 * @see Bean
 * @see Configuration
 * @see org.springframework.stereotype.Component
 */
/**
 *指示是否要对bean进行延迟初始化。
 *
 *<p>可以用于任何直接或间接用{@link注释的类
 *org.springframework.stereotype.Component@Component｝或注释为
 *｛@link-Bean@Bean｝。
 *
 *<p>如果此注释不存在于{@code@Component}或{@code@Bean}定义中，
 *将发生急切的初始化。如果存在并设置为｛@code true｝，则｛@code@Bean｝或
 *｛@code@Component｝在被另一个bean引用或显式引用之前不会初始化
 *从封闭的｛@link org.springframework.beans.factory.BeanFactory中检索
 *BeanFactory｝。如果存在并设置为｛@code false｝，则bean将在上实例化
 *由bean工厂启动，这些工厂对singleton执行急切的初始化。
 *
 *<p>如果Lazy出现在｛@link Configuration@Configuration｝类上，则
 *指示该｛@code@Configuration｝中的所有｛@code@Bean｝方法
 *应该延迟初始化。如果｛@code@Lazy｝存在并且在｛@code@Bean｝上为false
 *方法，这表明
 *重写“default lazy”行为，并且应该急切地初始化bean。
 *
 *<p>除了其在组件初始化中的作用外，还可以放置此注释
 *在用{@linkorg.springframework.beans.factory.annotation.Autowired}标记的注入点上
 *或{@link jakarta.inject.inject}：在这种情况下，它会导致创建
 *所有受影响依赖项的延迟解析代理，作为使用
 *{@link org.springframework.beans.factory.ObjectFactory}或{@link jakarta.inject.Provider}。
 *请注意，这样一个懒惰的解析代理将始终被注入；如果目标
 *依赖项不存在，您只能通过上的异常找到
 *调用。因此，这样的注入点会导致非直觉行为
 *用于可选的依赖项。对于程序等效项，允许延迟引用
 *更为复杂的是，可以考虑{@linkorg.springframework.beans.factory.ObjectProvider}。
 *
 *@作者Chris Beams
 *@作者Juergen Hoeller
 *@自3.0起
 *@见初级
 *@见憨豆
 *@请参阅配置
 *@参见org.springframework.stereotype.Component
 */
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {

	/**
	 * Whether lazy initialization should occur.
	 */
	/**
	 *是否应进行延迟初始化。
	 */
	boolean value() default true;

}
